<?php
namespace app\admin\controller;


/**
 * @title 投票管理
 * @description 接口说明
 * @group 后台投票管理
 * @header name:authorization require:1 default: desc:登陆的token
 */
class VoteInfo extends Base
{
    protected $_order = 'id desc';

    /**
     * @title 投票管理
     * @description 接口说明     
     * @author hardy
     * @url /admin/VoteInfo
     * @method GET
     *
     * @param name:id type:int require:0 default:1 other: desc:唯一ID，获取某条记录详情，则为必填，id和page选填其一
     * @param name:page type:int require:0 default:1 other: desc:页码数 获取第二页以上的数据必填，默认值为1，id和page选填其一
     * @param name:size type:int require:0 default:20 other: desc:每一页的数量，默认20
     * @param name:title type:string require: default: other: desc:活动名称
     * @param name:publish type:int require: default: other: desc:分页搜索可选条件，发布状态：未发布，展示中，已下架
     *
     * @return title:投票名称
     * @return start_time:活动开始时间
     * @return end_time:活动结束时间
     * @return vote_type:投票类型：单选投票、必选投票、多选投票
     * @return vote_limit:投票限制
     * @return period:投票周期：固定次数、周期次数
     * @return period_value:周期次数
     * @return sort_way:排序方式：编号正序、票数倒序、时间排序
     * @return init_vote:初始票数
     * @return init_browse:初始访问量
     * @return images:图片
     * @return content:内容
     * @return player_count:选手数量
     * @return vote_sum:投票总量
     * @return page_view:访问总量
     * @return status_desc:状态：未开始、进行中、已结束
     *
     * @return list:消息列表,有page参数则返回值list，list是一个数组，
     * @return size:每页最大数，默认20，可由前端传递参数决定 page参数返回值，
     * @return page:当前页，page参数返回值，
     * @return count:总记录数， page参数返回值，
     */
    public function gets()
    {
        parent::gets();
    }
    protected function _searchPage(&$where)
    {
        $data = input('get.');
        $key = 'title';
        if(!empty($data[$key])){
            $where[] = [$key,'like', "%{$data[$key]}%"];
        }
        $key = 'publish';
        if(isset($data[$key]) && $data[$key] !== ''){
            $where[] = [$key,'=', $data[$key]];
        }
    }

    /**
     * @title 创建投票信息 (post)
     * @description 用户登录
     * @author hardy
     * @url /admin/VoteInfo
     * @method POST
     * @param name:title type:string require:1 default: other: desc:投票名称
     * @param name:start_time type:int require:1 default: other: desc:活动开始时间
     * @param name:end_time type:int require:1 default: other: desc:活动结束时间
     * @param name:vote_type type:string require:1 default:必选投票 other: desc:投票类型：单选投票、必选投票、多选投票
     * @param name:vote_min type:int require:0 default: other: desc:投票限制多选最小值
     * @param name:vote_max type:int require:0 default: other: desc:投票限制多选最大值，或者必选的值
     * @param name:period type:string require:1 default:固定次数 other: desc:投票周期：固定次数、周期次数
     * @param name:period_value type:int require:1 default: other: desc:周期次数
     * @param name:sort_way type:string require:1 default:编号正序 other: desc:排序方式：编号正序、票数倒序、时间排序
     * @param name:init_vote type:int require:1 default: other: desc:初始票数
     * @param name:init_browse type:int require:1 default: other: desc:初始访问量
     * @param name:images type:string require:1 default: other: desc:图片
     * @param name:content type:string require:1 default: other: desc:内容
     *
     * @return title:投票名称
     * @return start_enroll:报名开始时间
     * @return end_time:报名结束时间
     * @return start_time:活动开始时间
     * @return end_time:活动结束时间
     * @return vote_type:投票类型：单选投票、必选投票、多选投票
     * @return vote_limit:投票限制
     * @return period:投票周期：固定次数、周期次数
     * @return period_value:周期次数
     * @return sort_way:排序方式：编号正序、票数倒序、时间排序
     * @return init_vote:初始票数
     * @return init_browse:初始访问量
     * @return images:图片
     * @return content:内容
     * @return player_count:选手数量
     * @return vote_sum:投票总量
     * @return page_view:访问总量
     * @return status_desc:状态：未开始、进行中、已结束
     *
     * @return list:消息列表,有page参数则返回值list，list是一个数组，
     * @return size:每页最大数，默认20，可由前端传递参数决定 page参数返回值，
     * @return page:当前页，page参数返回值，
     * @return count:总记录数， page参数返回值，
     */
    public function create(){
        parent::create();
    }
    /**
     * @title 修改投票信息（put）
     * @description 修改密码
     * @author hardy
     * @url /admin/VoteInfo
     * @method put
     *
     * @param name:id type:int require:1 default: other: desc:投票名称
     * @param name:end_enroll type:int require:0 default: other: desc:报名结束时间
     * @param name:start_time type:date require:0 default: other: desc:活动开始时间
     * @param name:end_time type:int require:0 default: other: desc:活动结束时间
     * @param name:vote_type type:string require:0 default:必选投票 other: desc:投票类型：单选投票、必选投票、多选投票
     * @param name:vote_min type:int require:0 default: other: desc:投票限制多选最小值
     * @param name:vote_max type:int require:0 default: other: desc:投票限制多选最大值，或者必选的值
     * @param name:period type:string require:0 default:固定次数 other: desc:投票周期：固定次数、周期次数
     * @param name:period_value type:int require:0 default: other: desc:周期次数
     * @param name:sort_way type:string require:0 default:编号正序 other: desc:排序方式：编号正序、票数倒序、时间排序
     * @param name:init_vote type:int require:0 default: other: desc:初始票数
     * @param name:init_browse type:int require:0 default: other: desc:初始访问量
     * @param name:images type:string require:0 default: other: desc:图片
     * @param name:content type:string require:0 default: other: desc:内容
     * @param name:status type:string require:0 default: other: desc:状态修改，可选值：未开始、进行中、已结束
     *
     * @return title:投票名称
     * @return start_enroll:报名开始时间
     * @return end_time:报名结束时间
     * @return start_time:活动开始时间
     * @return end_time:活动结束时间
     * @return vote_type:投票类型：单选投票、必选投票、多选投票
     * @return vote_limit:投票限制
     * @return period:投票周期：固定次数、周期次数
     * @return period_value:周期次数
     * @return sort_way:排序方式：编号正序、票数倒序、时间排序
     * @return init_vote:初始票数
     * @return init_browse:初始访问量
     * @return images:图片
     * @return content:内容
     * @return player_count:选手数量
     * @return vote_sum:投票总量
     * @return page_view:访问总量
     * @return status_desc:状态：未开始、进行中、已结束
     */
    public function update(){
        parent::update();
    }
    /**
     * @title 删除投票信息（delete）
     * @description 修改密码
     * @author hardy
     * @url /admin/VoteInfo
     * @method delete
     *
     * @param name:id type:int|string|array require:1 default: other: desc:单个删除：数字，多组删除：","隔开的数字或者数组
     */
    public function delete(){
        parent::delete();
    }
    /**
     * @title 投票统计
     * @description 修改密码
     * @author hardy
     * @url /admin/VoteInfo/statistics
     * @method get
     *
     * @param name:id type:int require:1 default: other: desc:投票id
     * @param name:time type:string require:0 default: other: desc:时间格式，一周最后一天
     * @return vote:7天内投票统计，是一个数组,其中包含date(天)和number（数量）
     * @return visit:7天内访问量的统计，是一个数组,其中包含date(天)和number（数量）
     * @return vote_day:今天的投票量
     * @return count_vote:总投票
     * @return visit_day:今天的访问量
     * @return visit_count:总访问量
     */
    public function statistics(){
        // 按天统计访问量
        $id = input('get.id');
        if (empty($id)){
            $this->responseFail('id必须');
        }
        // 取得开始和结束时间
        $time = input('get.time', date('Y-m-d'));
        $now = strtotime($time);
        $start = $now - 7 * 24 *3600;

        // 一周的投票量
        $voteDate = model('VotePlayer')->statistics($id, $start, $now);
        $data['vote'] = $this->timeSectionData($voteDate, $start, $now);
        // 一周的访问量
        $voteDate = model('Visit')->statistics($id, $start, $now);
        $data['visit'] = $this->timeSectionData($voteDate, $start, $now);
        // 今天的票
        $day = strtotime(date('Y-m-d'));
        $data['vote_day'] = model('VotePlayer')->where('vote_id', $id)->where('vote_time', '=', $day)->count();
        // 投票总量
        $data['count_vote'] = model('VotePlayer')->where('vote_id', $id)->count();
        // 访问量
        $data['visit_count'] = model('Visit')->where('vote_id', $id)->count();
        // 今天的访问量
        $data['visit_day'] = model('Visit')->where('vote_id', $id)->where('vote_time', '=', $day)->count();;
        $this->responseSuccess($data);
    }
    private function timeSectionData($data, $startTime, $endTime){
        $date = [];
        for($i = $startTime; $i <= $endTime; $i += 24 * 3600){
            $num = 0;
            foreach ($data as $item){
                if ($item['key'] == $i){
                    $num = $item['number'];
                }
            }
            $tem = [
                'date' => date('Y-m-d', $i),
                'number' =>$num
            ];
            $date[] = $tem;
        }
        return $date;
    }
}